package offer;

public class 顺时针打印矩阵29 {

    public static void main(String[] args) {
        int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
        spiralOrder(matrix);
    }

    /**
     * 打印方向	1. 根据边界打印	2. 边界向内收缩	3. 是否打印完毕
     * 从左向右	左边界l ，右边界 r	上边界 t 加 11	是否 t > b
     * 从上向下	上边界 t ，下边界b	右边界 r 减 11	是否 l > r
     * 从右向左	右边界 r ，左边界l	下边界 b 减 11	是否 t > b
     * 从下向上	下边界 b ，上边界t	左边界 l 加 11	是否 l > r
     *
     * @param matrix
     * @return
     */
    static int[] spiralOrder(int[][] matrix) {
        if (matrix.length == 0) {
            return new int[0];
        }

        // 左边界l
        int l = 0;
        // 上边界 t
        int t = 0;

        // 数组初始下标
        int x = 0;

        // 右边界 r
        int r = matrix[0].length - 1;
        //下边界 b
        int b = matrix.length - 1;

        // 初始化数组长度
        int[] res = new int[(r + 1) * (b + 1)];

        while (true) {
            // 从左到右
            for (int i = l; i <= r; i++) {
                // left to right.
                res[x++] = matrix[t][i];
            }
            // 下边界 < ++上边界
            if (++t > b) {
                break;
            }


            for (int i = t; i <= b; i++) {
                // top to bottom.
                res[x++] = matrix[i][r];
            }
            // 左边界 > --右边界
            if (l > --r) {
                break;
            }


            for (int i = r; i >= l; i--) {
                // right to left.
                res[x++] = matrix[b][i];
            }
            // 上边界 > --下边界
            if (t > --b) {
                break;
            }

            for (int i = b; i >= t; i--) {
                // bottom to top.
                res[x++] = matrix[i][l];
            }
            // 右边界 < ++左边界
            if (++l > r) {
                break;
            }
        }
        return res;
    }
}
